EF Core - Fric-frac model op basis van bestaande database
Home

EF Core - Fric-frac model op basis van bestaande database

EF Core - Fric-frac model op basis van bestaande database

In deze les bouwen we het model van een ASP.NET Core MVC-toepassing met behulp van Entity Framework. We gebruiken reverse engineering om een Entity Framework-model te maken op basis van een bestaande database. Dit heette vroeger Database First.

Stappenplan

  1. Tabellen zijn reeds gemaakt in de Fric-frac MySQL database: Fric-frac MySQL Data Definition Language.
  2. EF Core is reeds geïnstalleerd in je project: EF Core - installeren.
  3. Om het model te genereren gebruiken we de EF Core Package Manager Console Tools. Vermits we niet de MsSql Data Provider gebruiken maar de MySql Data Provider hebben we in EF Core - installeren daarvoor specifieke packages geïnstalleerd.
  4. EF Tools gebruikt de Solution Name als naam voor de root namespace van de modelklassen. Vermits onze solution Fric-frac heet en er in de namespacenamen geen koppeltekens mogen voorkomen gaan de we Solution een andere naam geven. Doen we dat niet moeten we manueel de namespaces aanpassen en daar heb ik geen zin in:
    Fric-frac Rename Solution
    Fric-frac Rename Solution
    Fric-frac Solution Renamed to FricFrac
    Fric-frac Solution Renamed to FricFrac
  5. Sluit Visual Studio en start open de solution met de nieuwe naam FricFrac.
  6. We kunnen nu het model laten genereren. We gaan de modelklassen eerst in een map met de naam Models/FricFrac plaatsen. Vandaar dat we de optie -OutputDir Models/FricFrac toevoegen.
  7. We beginnen met de fluent API:
    1. in de Project Manager typ je:
      PM>Scaffold-DbContext "server=164.132.231.13;user id=docent300;password=AqDHX9q2Z;port=3306;database=docent300;SslMode=none" Pomelo.EntityFrameworkCore.MySql -OutputDir Models/FricFrac
    2. als je de database wijzigt kan je de modelklassen opnieuw genereren en de oude laten overschrijven door de -Force optie toe te voegen:
      PM>Scaffold-DbContext "server=164.132.231.13;user id=docent300;password=AqDHX9q2Z;port=3306;database=docent300;SslMode=none" Pomelo.EntityFrameworkCore.MySql -OutputDir Models/FricFrac -Force
      
  8. We kunnen naast de fluent API ook Data Annotations gebruiken. We leren eerst wat Data Annotations zijn en daarna gaan we data geannoteerde modelklassen genereren.
    1. Validatie toevoegen aan de model klassen:
      1. EF Business regels toevoegen met attributen
      2. EF object relational mapping met attributen
      3. Een voorbeeld: PostalCodes Entiteit vervolledigen
    2. Om data-geannoteerde modelklassen te genereren:
      PM>Scaffold-DbContext "server=164.132.231.13;user id=docent300;password=AqDHX9q2Z;port=3306;database=docent300;SslMode=none" Pomelo.EntityFrameworkCore.MySql -OutputDir Models/FricFrac -Force -DataAnnotations
  9. Op basis van de metadata in de database zijn nu data-annotaties toegevoegd:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    
    namespace FricFrac.Models.FricFrac
    {
        public partial class Country
        {
            public Country()
            {
                Person = new HashSet<Person>();
            }
    
            [Required]
            [StringLength(50)]
            public string Name { get; set; }
            [StringLength(2)]
            public string Code { get; set; }
            [Column(TypeName = "int(11)")]
            public int Id { get; set; }
    
            [InverseProperty("Country")]
            public ICollection<Person> Person { get; set; }
        }
    }
  10. We zijn vertrokken van de bestaande Fric-frac database. We kunnen nu in de omgekeerde richting werken en de database laten wijzigen op basis van het model. Om dat te illustreren gaan we de Country modelklasse wijzigen:
    1. Om met migratie te kunnen werken moeten we eerst de tabellen in MySQL deleten en ze opnieuw laten aanmaken door Visual Studio. Ik weet dat dit onnozel lijkt. Maar ik zie voorlopig geen andere oplossing.
      1. In MySql run je de volgende script:
        use docent300;
        DROP TABLE IF EXISTS `User`;
        DROP TABLE IF EXISTS `Role`;
        DROP TABLE IF EXISTS `Person`;
        DROP TABLE IF EXISTS `Country`;
        DROP TABLE IF EXISTS `Event`;
        DROP TABLE IF EXISTS `EventCategory`;
        DROP TABLE IF EXISTS `EventTopic`;
      2. We creëren opnieuw de tabellen op de basis van het model van Fric-Frac:
        Add-Migration InitialCreate
      3. We updaten de MySql database met:
        Update-Database
    2. Voeg de property Code toe aan de Country modelklasse:
      using System;
      using System.Collections.Generic;
      using System.ComponentModel.DataAnnotations;
      using System.ComponentModel.DataAnnotations.Schema;
      
      namespace FricFrac.Models.FricFrac
      {
          public partial class Country
          {
              public Country()
              {
                  Person = new HashSet<Person>();
              }
      
              [Required]
              [StringLength(50)]
              public string Name { get; set; }
              [StringLength(2)]
              public string Code { get; set; }
              [Column(TypeName = "int(11)")]
              public int Id { get; set; }
              [StringLength(256)]
              public string Desc { get; set; }
      
              [InverseProperty("Country")]
              public ICollection<Person> Person { get; set; }
          }
      }
    3. Voer het volgende commando uit in de Package Manager Console:
      PM>Add-Migration AddCountryDesc
      
    4. De code voor die migratie wordt toegevoegd aan het project:
      Fric-frac Migration AddCountryCode
      Fric-frac Migration AddCountryCode
    5. Nadat we de migratie aan het project hebben toegevoegd kunnen we de database updaten:
      Update-Database
    6. En we zien dat de MySql database is geüpdated. Er is een migratie-tabel toegevoegd en de nieuwe Desc kolom staat nu in de Country tabel:
      Fric-frac Migration Database is updated
      Fric-frac Migration Database is updated

Bronnen

JI
2018-01-01 23:07:44